/**
 * @Author: 焦质晔
 * @Date: 2019/6/20
 * @Last Modified by: mikey.zhaopeng
 * @Last Modified time: 2019-11-01 10:57:29
 */
import axios from 'axios';
import qs from 'qs';
import globalconfig from '@/assets/js/config';
import store from '@/store';
import { getToken, getUserId, getOwnerCode, removeDataType, getAppId, removeAppId } from '@/assets/js/auth';
import router from '@/routes';
import { notifyAction } from '@/utils';
import { Message } from 'element-ui';
import { getSignature, getSignConfig } from '@/utils/sign';

console.log(router, router.currentRoute.path);

const codeMessage = {
  200: '服务器成功返回请求的数据。',
  201: '新建或修改数据成功。',
  202: '一个请求已经进入后台排队（异步任务）。',
  204: '删除数据成功。',
  400: '发出的请求有错误，服务器没有进行新建或修改数据的操作。',
  401: '用户没有权限（令牌、用户名、密码错误）。',
  403: '用户得到授权，但是访问是被禁止的。',
  404: '发出的请求针对的是不存在的记录，服务器没有进行操作。',
  406: '请求的格式不可得。',
  410: '请求的资源被永久删除，且不会再得到的。',
  422: '当创建一个对象时，发生一个验证错误。',
  500: '网络请求超时，请稍后重试~',
  502: '网关错误。',
  503: '服务不可用，服务器暂时过载或维护。',
  504: '网关超时。'
};

const getConfigHeaders = url => {
  console.log('url', url);
  let requestHeader = {
    appId: getAppId(),
    userAgent: 'pc',
    userId: getUserId() ? getUserId() : '',
    ownerCode: getOwnerCode(),
    Authorization: `Bearer ${getToken()}`
  };
  if (url) {
    let signConfig = getSignConfig(url);
    let signInfo = getSignature(signConfig, globalconfig.secret);
    requestHeader.timestamp = signConfig.timestamp;
    requestHeader.nonce = signConfig.nonce;
    requestHeader.sign = signInfo;
    requestHeader.clientId = globalconfig.client_id;
  }
  return requestHeader;
};

const instance = axios.create({
  baseURL: globalconfig.serverUrl,
  timeout: 200000,
  withCredentials: true, // 跨域请求时是否需要使用凭证
  paramsSerializer: params => {
    // 序列化 GET 请求参数 -> a: [1, 2] => a=1&a=2
    return qs.stringify(params, { arrayFormat: 'comma' });
  }
});

// 异常处理程序
const errorHandler = error => {
  const { response = {} } = error;
  const errortext = codeMessage[response.status] || response.statusText || '请稍后重试或联系管理员';
  notifyAction(errortext, 'error', `请求错误 ${response.status || '请稍后重试~'}`);
  if (router.currentRoute.path === '/login') {
    Message.closeAll();
    setTimeout(() => {
      Message({
        message: `请求错误 ${response.status || '请稍后重试~'}`,
        type: 'error',
        duration: 0
      });
    }, 300);
  }
  store.dispatch('app/clearBtnLoading');
  return Promise.reject(error);
};

// 请求拦截
instance.interceptors.request.use(config => {
  let menuId = '';
  if (config.menuId) {
    menuId = config.menuId;
  }
  console.log('config', config);
  // 请求头信息，token 验证
  config.headers.Authorization = 'Bearer ' + getToken();
  config.headers.clientId = globalconfig.client_id;
  config.headers.appId = getAppId();
  config.headers.userAgent = 'pc';
  config.headers.userId = getUserId() ? getUserId() : '';
  config.headers.ownerCode = getOwnerCode();

  let signInfo = {};
  let signConfig = {};
  console.log('config', config);
  console.log('config.url', config.url);
  console.log('config.url', `${config.url}?${decodeURIComponent(qs.stringify(config.params, { arrayFormat: 'comma' }))}`, config.params);
  if (config.params != undefined && config.params != null) {
    signConfig = getSignConfig(`${config.url.replace('\n', '')}?${decodeURIComponent(qs.stringify(config.params, { arrayFormat: 'comma' }))}`);
    signInfo = getSignature(signConfig, globalconfig.secret);
  } else {
    signConfig = getSignConfig(config.url);
    signInfo = getSignature(signConfig, globalconfig.secret);
  }
  config.headers.timestamp = signConfig.timestamp;
  config.headers.nonce = signConfig.nonce;
  config.headers.sign = signInfo;

  if (config.mark) {
    store.dispatch('app/createBtnLoading', { [config.mark]: true });
  }
  return config;
}, errorHandler);

// 响应拦截
instance.interceptors.response.use(response => {
  let { config, headers, data } = response;
  store.dispatch('app/clearBtnLoading');
  if (data.data && data.data.data) {
    data = data.data;
  }
  // 错误数据提示
  // if (data.resultCode !== 200 && data.resultCode !== 403) {
  //   let errMsg = data.errMsg;
  //   if (data.resultCode === 997 || data.resultCode === 998) {
  //     // 登录报错信息处理
  //     try {
  //       errMsg = JSON.parse(errMsg)['msg'];
  //     } catch (error) {}
  //   }
  //   if (data.resultCode === 40105 || data.resultCode === 40002) {
  //     notifyAction('当前用户登录超时或多台设备使用，请重新登录！', 'error');
  //     store.dispatch('app/createLogout');
  //     removeDataType();
  //     removeAppId();
  //     setTimeout(() => {
  //       if (config.goUrl) {
  //         router.push({ path: '/login' })
  //       } else {
  //         window.__GEEGAGUC__ ? window.__GEEGAGUC__.logout(config.gucUrl) : router.push({ path: '/login' });
  //       }
  //     }, 600);
  //     // setTimeout(() => router.push({ path: '/login' }), 100);
  //     return
  //   }
  //   errMsg && notifyAction(errMsg, 'error');
  // }
  // // token 过期，需要重新登录
  // if (data.code === 'JWT_ERROR' || data.resultCode === 40105 || data.resultCode === 40002 || response.status === 401) {
  //   notifyAction('当前用户登录超时或多台设备使用，请重新登录！', 'error');
  //   store.dispatch('app/createLogout');
  //   removeDataType();
  //   removeAppId();
  //   setTimeout(() => {
  //     if (config.goUrl) {
  //       router.push({ path: '/login' })
  //     } else {
  //       window.__GEEGAGUC__ ? window.__GEEGAGUC__.logout(config.gucUrl) : router.push({ path: '/login' });
  //     }
  //   }, 600);
  //   // setTimeout(() => router.push({ path: '/login' }), 100);
  // }
  // 判断是否为导出/下载
  if (config.responseType === 'blob') {
    return { headers, data };
  }
  if (config.responseType === 'arraybuffer') {
    return { headers, data };
  }
  return data;
}, errorHandler);

export { getConfigHeaders };
export default instance;
